/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.ecommerce.dao.impl;

import br.com.ecommerce.dao.PesquisaSatisfacaoDAO;
import br.com.ecommerce.dao.pojo.EntityPojo;
import br.com.ecommerce.dao.pojo.PesquisaSatisfacao;
import br.com.ecommerce.exceptions.DatabaseException;
import br.com.ecommerce.exceptions.IdInvalidoException;
import br.com.ecommerce.exceptions.ObjetoInvalidoException;
import br.com.ecommerce.factory.DatabaseFactory;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Afonso
 */
public class PesquisaSatisfacaoDAOImpl implements PesquisaSatisfacaoDAO {

    private PesquisaSatisfacao getIds() throws DatabaseException {

        List<PesquisaSatisfacao> result = this.readAll();
        PesquisaSatisfacao pesqSati = new PesquisaSatisfacao();
        if (!result.isEmpty()) {
            pesqSati = result.get((result.size()-1));

        }

        return pesqSati;
    }

    @Override
    public void create(EntityPojo obj) throws ObjetoInvalidoException,
                                                DatabaseException {
        if (obj == null || !(obj instanceof PesquisaSatisfacao)) {

           throw new ObjetoInvalidoException("Objeto POJO é null ou não "
                   + "é do tipo PesquisaCliente");
        }

        PesquisaSatisfacao pesqSati = (PesquisaSatisfacao)obj;
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sqlInsert;
        String sqlId;
            

        try {
            PesquisaSatisfacao pesqSatiID = getIds();
            Integer idPesquisa = pesqSatiID.getIdPesquisa()+1;
            Integer idPergunta = pesqSatiID.getIdPergunta()+1;
            stmt = conn.createStatement();
            sqlInsert = "insert into PESQUISA_SATISFACAO"
                    + " values ('" + idPesquisa + "', "
                    + "'" + idPergunta + "', "
                    + "'" + pesqSati.getPergunta() + "', "
                    + "'" + pesqSati.getSituacao() + "')";

            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.SEVERE, "SQL: " + sqlInsert);

            stmt.execute(sqlInsert);
            stmt.close();
            conn.close();
        } catch (DatabaseException ex) {
            throw new DatabaseException("Problemas ao recuperar os ultimos "
                    + "IDs para inserção");
        } catch (SQLException ex) {
            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }
    }

    @Override
    public EntityPojo readById(Integer idPrimaryKey) throws IdInvalidoException,
                                                            DatabaseException {

        throw new UnsupportedOperationException("Não há implementação "
                + "para esse método");

    }

    @Override
    public PesquisaSatisfacao readById(EntityPojo obj)
                                            throws ObjetoInvalidoException,
                                                    DatabaseException {

        if (obj == null || !(obj instanceof PesquisaSatisfacao)) {
           throw new ObjetoInvalidoException("Objeto POJO é null ou não "
                   + "é do tipo PesquisaSatisfacao");
        }

        
        PesquisaSatisfacao pesqSati = (PesquisaSatisfacao)obj;
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        PesquisaSatisfacao pesqSatiResult = null;
        try {
            sql = "SELECT * FROM PESQUISA_SATISFACAO "
                    + "WHERE ID_PESQUISA = " + pesqSati.getIdPesquisa() + "and "
                    + "ID_PERGUNTA = " + pesqSati.getIdPergunta();

            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if (rs.next()) {
                pesqSatiResult = new PesquisaSatisfacao();
                pesqSatiResult.setIdPesquisa(rs.getInt(1));
                pesqSatiResult.setIdPergunta(rs.getInt(2));
                pesqSatiResult.setPergunta(rs.getString(3));
                pesqSatiResult.setSituacao(rs.getInt(4));

            } else {
                 throw new DatabaseException("Não há dados na base de dados para"
                         + " a query: " + sql);

            }
            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return pesqSatiResult;
    }

    @Override
    public List readAll() throws DatabaseException {
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;
        List<PesquisaSatisfacao> list = new ArrayList<PesquisaSatisfacao>();
        try {
            sql = "SELECT * FROM PESQUISA_SATISFACAO "
                    + "ORDER BY ID_PESQUISA, ID_PERGUNTA";

            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);

            while (rs.next()) {
                PesquisaSatisfacao pesqSati = new PesquisaSatisfacao();
                pesqSati.setIdPesquisa(rs.getInt(1));
                pesqSati.setIdPergunta(rs.getInt(2));
                pesqSati.setPergunta(rs.getString(3));
                pesqSati.setSituacao(rs.getInt(4));

//                Logger.getLogger(ClienteDAOImpl.class.getName())
//                            .log(Level.INFO, "String SQL : " + cliente.toString());

                list.add(pesqSati);
            }


            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

        return list;

    }

    @Override
    public void deleteById(Integer id) throws IdInvalidoException,
                                                        DatabaseException {
        throw new UnsupportedOperationException("Não há implementação "
                + "para esse método");

    }

    @Override
    public void deleteById(EntityPojo obj) throws ObjetoInvalidoException,
                                                        DatabaseException {
        if (obj == null || !(obj instanceof PesquisaSatisfacao)) {
           throw new ObjetoInvalidoException("Objeto POJO é null ou não "
                   + "é do tipo PesquisaSatisfacao");
        }

        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;

        PesquisaSatisfacao pesqSati = (PesquisaSatisfacao)obj;

        try {
            sql = "UPDATE PESQUISA_SATISFACAO SET SITUACAO=0 "
                    + "WHERE ID_PESQUISA = " + pesqSati.getIdPesquisa() + " and "
                    + "ID_PERGUNTA = " + pesqSati.getIdPergunta();

            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();

            stmt.execute(sql);

            stmt.close();
            conn.close();

        } catch (SQLException ex) {
            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }
    }

    @Override
    public void update(EntityPojo obj) throws ObjetoInvalidoException,
                                                DatabaseException {
        if (obj == null || !(obj instanceof PesquisaSatisfacao)) {
           throw new ObjetoInvalidoException("Objeto POJO é null ou não "
                   + "é do tipo PesquisaSatisfacao");
        }

        PesquisaSatisfacao pesqSati = (PesquisaSatisfacao)obj;
        Connection conn = DatabaseFactory.getConnection();
        Statement stmt;
        String sql;

        try {
            sql = "UPDATE PESQUISA_SATISFACAO SET PERGUNTA='" +
                    pesqSati.getPergunta() + "', "
                    + "SITUACAO='" + pesqSati.getSituacao() + "' "
                    + "WHERE ID_PESQUISA = " + pesqSati.getIdPesquisa() + " and "
                    + "ID_PERGUNTA = " + pesqSati.getIdPergunta();

            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.INFO, "String SQL : " + sql);

            stmt = conn.createStatement();
            stmt.execute(sql);

            stmt.close();
            conn.close();
        } catch (SQLException ex) {
            Logger.getLogger(PesquisaSatisfacaoDAOImpl.class.getName())
                            .log(Level.SEVERE, ex.getMessage(), ex);

            throw new DatabaseException(ex.getMessage(), ex.getCause());
        }

    }


}
